import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;


public class MybatisPlusGenerator {

    public static final List<String> TBL_NAMES = new ArrayList<>();

    static {
        TBL_NAMES.add("canary_user_tbl");
    }

    public static void main(String[] args) {
        // 1) 使用固定的 DBConfig 配置（不再从 application.yml 读取）
        String url = "jdbc:mysql://localhost:3306/ganjiang-db";
        String username = "root";
        String password = "123456";

        if (isBlank(url) || isBlank(username)) {
            System.err.println("[GenGenerator] JDBC 配置不完整(url/username/password)。");
            return;
        }

        // 2) 配置输出目录（当前模块 src/main/java）
        String outputDir = projectPath() + "/src/main/java";

        // 3) 使用 MyBatis-Plus FastAutoGenerator
        FastAutoGenerator.create(url, username, password)
                .globalConfig(builder -> {
                    builder.outputDir(outputDir)
                            .author("mp-gen") // 可选
                            .disableOpenDir()
                            .commentDate("yyyy-MM-dd");
                })
                .packageConfig(builder -> {
                    // 父包为 com.x.ganjiang.gen，分别指定子包
                    builder.parent("com.x.ganjiang.gen")
                            .entity("data")
                            .service("dao") // 服务接口放在 dao 包
                            .serviceImpl("dao.impl") // 服务实现放在 dao.impl 包
                            .mapper("infra.mapper")
                            // 仅为演示，XML 不输出，这里仍需占位 map，否则可不配置
                            .pathInfo(new HashMap<OutputFile, String>());
                })
                .strategyConfig(builder -> {
                    builder.addInclude(TBL_NAMES)
                            .addTableSuffix("_tbl")
                            // entity 命名与策略
                            .entityBuilder()
                                .enableFileOverride()
                                .naming(NamingStrategy.underline_to_camel)
                                .columnNaming(NamingStrategy.underline_to_camel)
                                .formatFileName("%sDO")
                                .enableLombok()
                            .mapperBuilder()
                                .enableFileOverride()
                                .formatMapperFileName("%sMapper")
                                .enableBaseResultMap()
                                .enableBaseColumnList()
                            .serviceBuilder()
                                .enableFileOverride()
                                // Service 接口命名为 %sIService；实现为 %sIServiceImpl
                                .formatServiceFileName("%sIService")
                                .formatServiceImplFileName("%sIServiceImpl")
                            .controllerBuilder()
                                // 不需要 Controller
                            .disable();
                })
                .templateConfig(builder -> {
                    // 禁用不需要的模板
                    builder.controller(null)
                           .xml(null);
                })
                .execute();

        System.out.println("[GenGenerator] 生成完成：");
        System.out.println(" - Entity: com.x.ganjiang.gen.data.<Name>DO");
        System.out.println(" - Service: com.x.ganjiang.gen.dao.<Name>IService");
        System.out.println(" - ServiceImpl: com.x.ganjiang.gen.dao.impl.<Name>IServiceImpl");
        System.out.println(" - Mapper: com.x.ganjiang.gen.infra.mapper.<Name>Mapper");
    }

    private static String projectPath() {
        // 当前工作目录即为项目根目录 f:/code/per/x-ganjiang
        return new File("").getAbsolutePath().replace("\\", "/");
    }


    private static boolean isBlank(String s) {
        return s == null || s.trim().isEmpty();
    }
}